package com.zhs.base.service;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zhs.base.dto.GeoCodeDto;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.CharEncoding;
import org.apache.commons.lang3.math.NumberUtils;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Objects;

/**
 * @author Java架构师之旅
 * @version 1.0
 * @date 2022年08月16日 17:14.
 */
@Slf4j
public abstract class BaseMapApiService {
    private static final double EARTH_RADIUS = 6371.393;


    protected String encode(String str) throws UnsupportedEncodingException {
        // 将地址转换成utf-8的16进制
        return URLEncoder.encode(str, CharEncoding.UTF_8);
    }

    /**
     * 适合百度  腾讯
     */
    protected GeoCodeDto defaultDealReturnJson(final String str) throws RuntimeException {
        JSONObject jsonObject = JSON.parseObject(str);
        String status = jsonObject.getString("status");
        if (Objects.equals(NumberUtils.INTEGER_ZERO, Integer.valueOf(status))) {// 0 表示查询成功
            JSONObject result_obj = JSON.parseObject(jsonObject.getString("result"));
            String location_obj = result_obj.getString("location");
            JSONObject location_ = JSON.parseObject(location_obj);
            final GeoCodeDto geoCodeDto = new GeoCodeDto();
            geoCodeDto.setLng(location_.getString("lng"));
            geoCodeDto.setLat(location_.getString("lat"));
            log.info("【地址编码】 geoCodeDto={}", JSON.toJSONString(geoCodeDto));
            return geoCodeDto;
        }
        log.warn("【地址编码】 失败 str={}", str);
        throw new RuntimeException(jsonObject.getString("message"));
    }

    private static double rad(double d) {
        return d * Math.PI / 180.0;
    }

    /**
     * 计算两个经纬度之间的距离 计算结果单位：米
     *
     * @param lat1 纬度1
     * @param lng1 经度1
     * @param lat2 纬度2
     * @param lng2 经度2
     * @return
     */
    public static double getDistance(double lng1, double lat1, double lng2, double lat2) {
//
//        if (properties.getUseGd()) { //使用高德地图API
//            double[] arr1 = MapConvertUtil.bd09_To_Gcj02(lat1, lng1);
//            double[] arr2 = MapConvertUtil.bd09_To_Gcj02(lat2, lng2);
//            lat1 = arr1[0];
//            lng1 = arr1[1];
//            lat2 = arr2[0];
//            lng2 = arr2[1];
//        } else { //默认使用百度API
//
//        }
        double radLat1 = rad(lat1);
        double radLat2 = rad(lat2);
        double a = radLat1 - radLat2;
        double b = rad(lng1) - rad(lng2);
        double s = 2 * Math.asin(Math.sqrt(
            Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
        s = s * EARTH_RADIUS;
        s = Math.round(s * 1000);
        return s;
    }

    //    public static void main(String[] args) {
//        // A点 36.665777,117.034727 	B点  36.665871，117.041006
//        System.out.println(getDistance(36.665777, 117.034727 , 36.665871, 117.041006));//AB直线700米左右
//        System.out.println(getDistance(121.305852, 31.210411, 121.313755, 31.202890));//AB直线1124米左右
//    }
}
